From de5b7136cd89514104a926ec2c016ccf5328cf7f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 24 Jun 2014 22:05:33 -0700 Subject: [PATCH] Switch the process builder to starting from ToCStr This is the same as the libstd Command builder, and will soon be used in the tests for spawning processes on windows. --- src/cargo/util/process_builder.rs | 32 ++++++++++++------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/cargo/util/process_builder.rs b/src/cargo/util/process_builder.rs index e5fec4f1a..1eb7a5f23 100644 --- a/src/cargo/util/process_builder.rs +++ b/src/cargo/util/process_builder.rs @@ -1,14 +1,15 @@ use std::fmt; use std::fmt::{Show, Formatter}; use std::os; -use std::path::Path; +use std::c_str::CString; use std::io::process::{Command, ProcessOutput, InheritFd}; -use util::{ProcessError, process_error}; use std::collections::HashMap; +use util::{ProcessError, process_error}; + #[deriving(Clone,PartialEq)] pub struct ProcessBuilder { - program: String, + program: CString, args: Vec, path: Vec, env: HashMap, @@ -17,7 +18,7 @@ pub struct ProcessBuilder { impl Show for ProcessBuilder { fn fmt(&self, f: &mut Formatter) -> fmt::Result { - try!(write!(f, "`{}", self.program)); + try!(write!(f, "`{}", self.program.as_str().unwrap_or(""))); if self.args.len() > 0 { try!(write!(f, " {}", self.args.connect(" "))); @@ -113,16 +114,17 @@ impl ProcessBuilder { } pub fn build_command(&self) -> Command { - let mut command = Command::new(self.program.as_slice()); + let mut command = Command::new(self.program.as_bytes_no_nul()); command.args(self.args.as_slice()).cwd(&self.cwd); command } fn debug_string(&self) -> String { + let program = self.program.as_str().unwrap_or(""); if self.args.len() == 0 { - self.program.to_str() + program.to_string() } else { - format!("{} {}", self.program, self.args.connect(" ")) + format!("{} {}", program, self.args.connect(" ")) } } @@ -166,22 +168,12 @@ impl ProcessBuilder { } } -pub fn process(cmd: &str) -> ProcessBuilder { +pub fn process(cmd: T) -> ProcessBuilder { ProcessBuilder { - program: cmd.to_str(), + program: cmd.to_c_str(), args: vec!(), path: vec!(), cwd: os::getcwd(), - env: system_env() - } -} - -fn system_env() -> HashMap { - let mut ret = HashMap::new(); - - for &(ref key, ref val) in os::env().iter() { - ret.insert(key.to_str(), val.to_str()); + env: os::env().move_iter().collect() } - - ret } -- 2.30.2